這篇介紹 API 服務整合
若頁面內容不全靠 SSR 產生,部分頁面資料得透過瀏覽器向第三方、自架 API 後端抓取,會碰到跨域 + CORS 問題。
為什麼需要特別處理跨域請求?
瀏覽器為了防止惡意網站竊取資料,採用同源政策,防止惡意網站 B 竊取你在 A 站的 Cookie,像是藉由你已登入 Amazon 的 Cookie,盜用身份買東西。
「同源」定義很簡單,以下三個參數都相同
[protocol]://[domain]:[port]
白話說,當你在 https://www.example.com/product.html
頁面
嘗試對以下路徑發出請求,都違反同源
乖孩子遵守同源,不會被打
第一關考驗沒過,這時請求會遵循 CORS 規則,打第二關
我們可以透過上一章「反向代理」直接處理同源,就先不用討論 CORS 規則。
首先第一種 - Reverse Proxy
在 nginx.conf 設定 api 反向代理,讓同一個網域下
/api
請求轉給 API Service (可能是 Node Server 或其他語言寫的 API 服務)第二種,透過 Nuxt 做 Proxy - @nuxtjs/proxy
nginx 設定同上一篇,domain 下所有請求都轉給 Nuxt
Nuxt 再透過 proxy module (@nuxtjs/proxy),把 /api
請求轉發給另一個 API Service
安裝 @nuxtjs/proxy,nuxt.config.js
設定 @nuxtjs/proxy
{
modules: [
'@nuxtjs/proxy',
],
proxy: [
// Proxies /api/products/*/**.json to http://127.0.0.1:8080
'http://127.0.0.1:8080/api/products/*/**.json',
]
}
兩種做法都可以符合同源政策,至於優缺比較
以前端角度偏好 @nuxtjs/proxy
(設定不需要透過 DevOps 或後端),但也因所有 API 請求得透過 Nuxt,會造成效能瓶頸。
若有公司有 DevOps 或其他人管機器,請人設定反向代理會比較好。